From: Liang Li Date: Tue, 7 Apr 2015 13:27:02 +0000 (+0800) Subject: x86/hvm: Fix the unknown nested vmexit reason 80000021 bug X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3452 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=f7708796db463410a97b5fa3dd5902f6e8a1d102;p=xen.git x86/hvm: Fix the unknown nested vmexit reason 80000021 bug This bug will be trigged when NMI happen in the L2 guest. The current code handles the NMI incorrectly. According to Intel SDM 31.7.1.2 (Resuming Guest Software after Handling an Exception), If bit 31 of the IDT-vectoring information fields is set, and the virtual NMIs VM-execution control is 1, while bits 10:8 in the IDT-vectoring information field is 2, bit 3 in the interruptibility-state field should be cleared to avoid the next VM entry fail. Signed-off-by: Liang Li Acked-by: Kevin Tian Acked-by: Andrew Cooper --- diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 8dbd3148de..6c4f78c924 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2628,7 +2628,8 @@ static void vmx_idtv_reinject(unsigned long idtv_info) * Clear NMI-blocking interruptibility info if an NMI delivery faulted. * Re-delivery will re-set it (see SDM 3B 25.7.1.2). */ - if ( (idtv_info & INTR_INFO_INTR_TYPE_MASK) == (X86_EVENTTYPE_NMI<<8) ) + if ( cpu_has_vmx_vnmi && ((idtv_info & INTR_INFO_INTR_TYPE_MASK) == + (X86_EVENTTYPE_NMI<<8)) ) { unsigned long intr_info; @@ -2779,8 +2780,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) hvm_maybe_deassert_evtchn_irq(); __vmread(IDT_VECTORING_INFO, &idtv_info); - if ( !nestedhvm_vcpu_in_guestmode(v) && - exit_reason != EXIT_REASON_TASK_SWITCH ) + if ( exit_reason != EXIT_REASON_TASK_SWITCH ) vmx_idtv_reinject(idtv_info); switch ( exit_reason )